SPB Git forge

spb/rareindex

Public
54commits 1branches 0releases
7.1 MBsize
maindefault branch
11 days agolast push
TypeScript 61.9% HTML 37.2% SQL 0.7%
2.7 KB · 65 lines tsx
Raw Blame History
1import type { Metadata } from 'next';2import Link from 'next/link';3import { notFound } from 'next/navigation';4import { requireUser } from '@/lib/auth/session';5import { getCollection } from '@/lib/account/queries';6import { PageHeader, btnSecondary } from '@/components/account/page-header';7import { Card, CardHeader } from '@/components/ui/primitives';8import { ImportForm } from './import-form';910export const metadata: Metadata = { title: 'Import CSV', robots: { index: false } };1112const TEMPLATE = 'asset_id,asset_slug,quantity,acquired_at,purchase_price,currency,grader,grade,cert,serial,source,condition,notes,tags\n,1999-base-set-charizard-4-102-1st-edition,1,2021-05-14,3200,USD,psa,10,12345678,,eBay,,bought from a friend,grail|sealed\n';1314export default async function ImportPage({ params }: { params: Promise<{ id: string }> }) {15  const { id } = await params;16  const u = await requireUser(`/collections/${id}/import`);17  const col = await getCollection(u.id, id);18  if (!col) notFound();19  return (20    <>21      <nav className="mb-2 text-xs text-muted">22        <Link href={`/collections/${id}`} className="hover:text-fg">23          {col.name}24        </Link>{' '}25        / <span className="text-fg">Import</span>26      </nav>27      <PageHeader title="Import items from CSV" description="Up to 500 rows per file. Each row needs an asset_id (rare_…) or asset_slug from RareIndex; unknown assets are skipped and reported." actions={<a href={`data:text/csv;charset=utf-8,${encodeURIComponent(TEMPLATE)}`} download="rareindex-import-template.csv" className={btnSecondary}>Download template</a>} />28      <div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_320px]">29        <Card>30          <CardHeader title="Upload" />31          <div className="p-4">32            <ImportForm collectionId={id} />33          </div>34        </Card>35        <Card>36          <CardHeader title="Columns" />37          <ul className="space-y-1 p-4 text-xs text-muted">38            <li>39              <code>asset_id</code> or <code>asset_slug</code> — required40            </li>41            <li>42              <code>quantity</code> — default 143            </li>44            <li>45              <code>acquired_at</code> — YYYY-MM-DD46            </li>47            <li>48              <code>purchase_price</code>, <code>currency</code> — per unit, converted at acquisition-date FX49            </li>50            <li>51              <code>grader</code>, <code>grade</code>, <code>cert</code>, <code>serial</code>52            </li>53            <li>54              <code>source</code>, <code>condition</code>, <code>notes</code>55            </li>56            <li>57              <code>tags</code> — separated by <code>|</code> or commas58            </li>59          </ul>60        </Card>61      </div>62    </>63  );64}65